package com.designPattern.pp06DynamicProxy;

/**
 * jdk实现动态代理
 *
 * @author luhd
 * @date 2022-05-08
 */
public class Client {
    public static void main(String[] args) {
        /**
         * 创建目标对象
         */
        TeacherDao target = new TeacherDao();

        /**
         * 给目标对象创建代理对象，可以转成ITeacherDao
         */
        ITeacherDao proxyInstance = (ITeacherDao)new ProxyFactory(target).getProxyInstance();

        /**
         * 内存中动态生成了代理对象
         */
        System.out.println("proxyInstance="+proxyInstance.getClass());

        /**
         * 通过代理对象调用目标对象
         */
        // proxyInstance.teach();
        proxyInstance.sayHello("tom");
    }

    /**
     * 1.静态代理：目标对象和代理对象需要实现同一个接口，代理对象内部聚合目标对象，调用接口的方法
     * 2.动态代理jdk：目标对象需要实现一个接口，代理对象内部维护一个目标对象，构造器初始化，用jdk代理给目标对象生成一个代理对象Proxy.newProxyInstance(target.getClass().getClassLoader(),
     * 				target.getClass().getInterfaces(),()-{})
     * 3.动态代理cglib：目标对象不需要实现接口（目标对象不能是final/static），这个时候可以使用目标对象的子类来实现代理，这就是cglib代理。。
     *                在内存中创建一个子类对象从而实现对目标对象的功能的扩展
     *                Cglib是一个强大的高性能的代码生成包,它可以在运行期扩展java类与实现java接口.它广泛的被许多AOP的框架使用,例如Spring AOP，实现方法拦截
     */
}
